#include"graph.h"
namespace HBR998244353{
	using namespace std;
	const int MaxN=500;
	int nodeSize=0,gsize[MaxN+1],pedge[MaxN+1];
	int g[MaxN+1][MaxN+1],t[MaxN+1][MaxN+1],cnt[MaxN+1];
	int pwt[]={1,3,9,27,81,243,729};
	int GetTit(int x,int k){return x/pwt[k]%3;}
	int Min(int a,int b){return a<b?a:b;}
	int DFS1(){
		if(Color()==2){
			Move(LastRoad(),2);
			return 0;
		}
		int u=++nodeSize;
		pedge[u]=LastRoad();
		gsize[u]=NumberOfRoads();
		for(int i=1;i<=gsize[u];i++){
			if(i==pedge[u])continue;
			Move(i,2);
			g[u][i]=DFS1();
		}
		if(pedge[u]!=-1)Move(pedge[u],2);
		return u;
	}
	void DFS2(int u,int c){
		for(int i=1;i<=gsize[u];i++){
			if(!g[u][i])continue;
			Move(i,GetTit(u,c)+1);
			DFS2(g[u][i],c);
		}
		for(int i=1;i<=gsize[u];i++){
			if(g[u][i]||i==pedge[u])continue;
			Move(i,GetTit(u,c)+1);
			t[u][i]+=pwt[c]*(Color()-1);
			Move(LastRoad(),Color());
		}
		if(u!=1)Move(pedge[u],GetTit(u,c)+1);
	}
	int v[MaxN+1][MaxN+1];
	void Solve(int p){
		DFS1();
//		for(int i=1;i<=nodeSize;i++){
//			cout<<i<<'('<<gsize[i]<<')'<<':';
//			for(int j=1;j<=gsize[i];j++)
//				cout<<g[i][j]<<' ';
//			cout<<'\n';
//		}
		for(int j=0,v=1;v<=nodeSize;j++,v*=3)DFS2(1,j);
		for(int i=1;i<=nodeSize;i++)
			for(int j=1;j<=nodeSize;j++)
				v[i][j]=1e9;
		for(int i=1;i<=nodeSize;i++)
			for(int j=1;j<=gsize[i];j++)
				if(j!=pedge[i])
					v[i][g[i][j]+t[i][j]]=v[g[i][j]+t[i][j]][i]=1;
		for(int k=1;k<=nodeSize;k++)
			for(int i=1;i<=nodeSize;i++)
				for(int j=1;j<=nodeSize;j++)
					v[i][j]=Min(v[i][j],v[i][k]+v[k][j]);
		for(int i=1;i<=nodeSize;i++)
			for(int j=i+1;j<=nodeSize;j++)
				if(v[i][j]<=p)cnt[v[i][j]]++;
		for(int i=1;i<=p;i++)Answer(i,cnt[i]);
	}
}
void Inspect(int R){
	HBR998244353::Solve(R);
}
